home *** CD-ROM | disk | FTP | other *** search
- /*
- * Program: spell.c
- *
- * Author: Michael Seibel
- * Networks and Distributed Computing
- * Computing & Communications
- * University of Washington
- * Administration Building, AG-44
- * Seattle, WA 98195
- * Internet: <author's email address>@CAC.Washington.EDU
- *
- * Date: 30 July 1991
- * Last Edited: 6 Jan 1992
- *
- * Copyright 1991 by the University of Washington
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appears in all copies and that both the
- * above copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the University of Washington not be
- * used in advertising or publicity pertaining to distribution of the software
- * without specific, written prior permission. This software is made
- * available "as is", and
- * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
- * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
- * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
- * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
- #include <stdio.h>
- #include "osdep.h"
- #include "estruct.h"
- #ifdef SPELLER
- #include "edef.h"
- #include "pico.h"
-
-
- #define NSHLINES 12
-
- static char *spellhelp[] = {
- "Spell Check Help",
- " ",
- "\tThe spell checker examines all words in the text. It then",
- "\toffers each misspelled word for correction while simultaneously",
- "\thighlighting it in the text. To leave a word unchanged simply",
- "~\thit ~R~e~t~u~r~n at the edit prompt. If a word has been corrected,",
- "\teach occurrence of the incorrect word is offered for replacement.",
- " ",
- "~\tSpell checking can be canceled at any time by typing ~^~C (~F~3)",
- "\tafter exiting help.",
- " ",
- "End of Spell Check Help",
- " ",
- NULL
- };
-
-
-
- /*
- * spell() - check for potentially missspelled words and offer them for
- * correction
- */
- spell(f, n)
- {
- int status, next, khelp = 0, ret;
- FILE *p;
- char *b, *sp, *fn;
- char wb[NLINE], cb[NLINE];
- char *writetmp();
- FILE *P_open();
-
- setmark(0, 1);
- emlwrite("Checking spelling..."); /* greetings */
-
- if((fn = writetmp(0, 0)) == NULL){
- emlwrite("Can't write temp file for spell checker");
- return(-1);
- }
- if((sp = (char *)getenv("SPELL")) == NULL)
- sp = SPELLER;
- sprintf(s, "( %s ) < %s", sp, fn);
-
- if((p=P_open(s)) == NULL){ /* read output from command */
- unlink(fn);
- emlwrite("Can't fork spell checker");
- return(-1);
- }
-
- khelp = 0;
- ret = 1;
- while(fgets(wb, NLINE, p) != NULL && ret){
- if((b = (char *)strchr(wb,'\n')) != NULL)
- *b = '\0';
- strcpy(cb, wb);
-
- gotobob(0, 1);
-
- if(Pmaster == NULL)
- sgarbk = FALSE;
-
- status = TRUE;
- next = 1;
-
- while(status){
- if(!khelp++) /* not too early */
- wkeyhelp("GC0000000000", "Get Help,Cancel");
-
- if(next++)
- if(movetoword(wb) != TRUE)
- break;
-
- update();
- (*term.t_rev)(1);
- pputs(wb); /* highlight word */
- (*term.t_rev)(0);
-
- if(strcmp(cb, wb)){
- sprintf(s, "Replace %s with %s", wb, cb);
- status=mlyesno(s, TRUE);
- }
- else
- status=mlreplyd("Edit a replacement: ", cb, NLINE, QDEFLT);
-
-
- curwp->w_flag |= WFMOVE; /* put cursor back */
- update();
- pputs(wb); /* un-highlight */
-
- switch(status){
- case TRUE:
- chword(wb, cb); /* correct word */
- case FALSE:
- update(); /* place cursor */
- break;
- case ABORT:
- emlwrite("Spell Checking Aborted", NULL);
- ret = FALSE;
- status = FALSE;
- break;
- case HELPCH:
- if(Pmaster)
- (*Pmaster->helper)(spellhelp, "Help with Spelling Checker", 1);
- else
- pico_help(spellhelp, "Help with Spelling Checker", 1);
- case (CTRL|'L'):
- next = 0; /* don't get next word */
- khelp = 0; /* key help has changed */
- sgarbf = TRUE; /* repaint full screen */
- update();
- status = TRUE;
- continue;
- default:
- emlwrite("Huh?"); /* shouldn't get here, but.. */
- status = TRUE;
- sleep(1);
- break;
- }
- forwword(0, 1); /* goto next word */
- }
- }
- P_close(p); /* clean up */
- unlink(fn);
- swapmark(0, 1);
- curwp->w_flag |= WFHARD|WFMODE;
-
- if(Pmaster == NULL)
- sgarbk = TRUE;
-
- if(ret)
- emlwrite("Done checking spelling");
- return(ret);
- }
-
-
-
-
- /*
- * chword() - change the given word, wp, pointed to by the curwp->w_dot
- * pointers to the word in cb
- */
- chword(wb, cb)
- char *wb; /* word buffer */
- char *cb; /* changed buffer */
- {
- ldelete(strlen(wb), 0); /* not saved in kill buffer */
- while(*cb != '\0')
- linsert(1, *cb++);
-
- curwp->w_flag |= WFEDIT;
- }
-
-
-
-
- /*
- * movetoword() - move to the first occurance of the word w
- *
- * returns:
- * TRUE upon success
- * FALSE otherwise
- */
- movetoword(w)
- char *w;
- {
- int i;
- int ret = FALSE;
- int olddoto;
- LINE *olddotp;
- register int off; /* curwp offset */
- register LINE *lp; /* curwp line */
-
- olddoto = curwp->w_doto; /* save where we are */
- olddotp = curwp->w_dotp;
-
- curwp->w_bufp->b_mode |= MDEXACT; /* case sensitive */
- while(forscan(&i, w, 1) == TRUE){
- if(i)
- break; /* wrap NOT allowed! */
-
- lp = curwp->w_dotp; /* for convenience */
- off = curwp->w_doto;
-
- /*
- * We want to minimize the number of substrings that we report
- * as matching a misspelled word...
- */
- if(off == 0 || !isalpha(lgetc(lp, off - 1))){
- off += strlen(w);
- if((!isalpha(lgetc(lp, off)) || off == llength(lp))
- && lgetc(lp, 0) != '>'){
- ret = TRUE;
- break;
- }
- }
-
- forwchar(0, 1); /* move on... */
-
- }
- curwp->w_bufp->b_mode ^= MDEXACT; /* case insensitive */
-
- if(ret == FALSE){
- curwp->w_dotp = olddotp;
- curwp->w_doto = olddoto;
- }
- else
- curwp->w_flag |= WFHARD;
-
- return(ret);
- }
- #endif /* SPELLER */
-